package com.zhouyiquan.qqserver.service;

import com.zhouyiquan.qqcommon.Message;
import com.zhouyiquan.qqcommon.MessageType;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Iterator;

/**
 * @Author: 周益全 (https://gitee.com/zfovikqdev928)
 * @BugFeedBackEmail: zfovikqdev928@126.com
 * @Date: Create in 2023-01
 * @Description: 服务器端线程，该类的一个对象和某个客户端保持通信
 * @Version:
 */
public class ServerConnectClientThread extends Thread {
    private Socket socket;
    private String userId; // 连接到服务器端的客户信息

    public ServerConnectClientThread(Socket socket, String userId) {
        this.socket = socket;
        this.userId = userId;
    }

    public Socket getSocket() {
        return socket;
    }

    @Override
    public void run() {
        // 线程 ---> 发送 / 接受消息
        while (true) {
            try {
                System.out.println("服务器端和客户端（" + userId + "）保持通信，并读取客户端发送过来的数据");
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                Message message = (Message) ois.readObject();
                if (message.getMessageType().equals(MessageType.MESSAGE_GET_ONLINE_FRIEND)) { // 1 拉取在线用户
                    System.out.println(message.getSender() + "要拉取在线用户列表...");

                    // 服务器端响应格式要求为： 100 200 300 至尊宝 紫霞仙子...
                    String onlineUser = ManageServerConnectClientThread.getOnlineUser();
                    Message message2 = new Message();
                    message2.setMessageType(MessageType.MESSAGE_RET_FRIEND);
                    message2.setContent(onlineUser); // 封装 用户列表

                    // recipient： 接收者
                    // sender ：   发送者
                    // 谁发请求，就由谁接收
                    message2.setRecipient(message.getSender());

                    // 将 Message 返回给客户端
                    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                    oos.writeObject(message2);

                } else if (message.getMessageType().equals(MessageType.MESSAGE_CLIENT_EXIT)) { // 9 客户端退出系统
                    System.out.println(message.getSender() + "客户端退出系统");
                    // 移除客户端对应的线程
                    ManageServerConnectClientThread.removeThread(message.getSender());
                    socket.close();
                    // 退出循环，线程结束
                    break;
                } else if (message.getMessageType().equals(MessageType.MESSAGE_COMM_MES)) { // 3 私聊信息
                    ServerConnectClientThread serverConnectClientThread = ManageServerConnectClientThread.getServerConnectClientThread(message.getRecipient());
                    ObjectOutputStream oos = new ObjectOutputStream(serverConnectClientThread.socket.getOutputStream());
                    oos.writeObject(message);
                } else if (message.getMessageType().equals(MessageType.MESSAGE_To_ALL_MES)) { // 2 群发消息
                    // 遍历线程集合
                    HashMap<String, ServerConnectClientThread> hm = ManageServerConnectClientThread.getHm();
                    Iterator<String> iterator = hm.keySet().iterator();

                    // 取出在线用户的 ID
                    while (iterator.hasNext()) {
                        String onlineUserId = iterator.next();
                        if (!message.getSender().equals(onlineUserId)) {
                            ObjectOutputStream oos = new ObjectOutputStream(hm.get(onlineUserId).getSocket().getOutputStream());
                            oos.writeObject(message);
                        }
                    }
                } else {
                    System.out.println("其他 Message 类型暂不做处理...");
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}
